package com.cskaoyan.javase.oop1._16oop;

/**
 * 面向对象思想是面向过程的更进一步,将属性和行为封装成一个对象,程序中依赖对象实现功能
 * 最主要解决的就是程序的代码复用,扩展性和可维护性的问题.
 *
 * 用面向对象的思想,来把大象放进冰箱里
 * 对象: 大象对象和冰箱对象
 * 类:
 *      大象类: 属性,会自己走进冰箱
 *      冰箱类: 属性,会自己开门,会自己关门
 *
 * 面向对象思想程序的优缺点
 * 优点:
 *      1.面向对象思想的程序是按照功能划分不同的对象,进而程序也能划分成不同的功能模块,虽然不同的功能模块之间仍然需要
 *          交互,但总体是相对独立的
 *          这就有利于分工合作,每个程序员就单独只完成自己的任务就可以了,不需要管别人的事情.
 *
 *      2.面向对象思想的程序由于独立性很高,那么代码复用性就很好,这有利于功能的扩展,大幅提升了程序的可维护性(这是主要优点)
 *
 * 缺点:
 *      1.花里胡哨,如果是很简单的需求,完全可以直接实现.现在非要找个对象去实现.而且为了对象的独立性,就需要做很多额外的操作,这会导致程序越来越臃肿.
 *      我们使用面向对象的思想的初衷,是为了简化程序开发,但最终我们都忘记了初心,面向对象的程序会变得越来越臃肿,反而变得更复杂了.
 *      2.程序开销大运行效率低，对象不是凭空产生的，需要时间创建和内存存储。
 *
 * 所以面向对象思想，适合于开发大型的企业级应用，如果只是一个简单的小需求，还不如直接面向过程完成。
 *
 * @since 11:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // 创建对象
        Elephant e = new Elephant();
        Fridge f = new Fridge();
        e.fridge = f;

        // 开始调用方法
        e.into();
        f.open();
        e.into();
        f.close();
    }
}

class Elephant {
    // 属性
    // 依赖冰箱对象,这样可以随时获取门的状态
    Fridge fridge;

    // 行为
    public void into() {
        // 大象想进去,门必须是开的,所以这里必须获取冰箱门的状态
        if (fridge.doorState) {
            // 门开着
            System.out.println("我进去了,冰箱关门吧!");
            return;
        }
        // 门关着的
        System.out.println("门没开,赶紧开门!");

    }
}

class Fridge {
    // 属性
    // 门的状态,默认是false表示关着,true表示开着
    boolean doorState = false;

    // 行为
    public void open() {
        if (!doorState) {
            // 把门打开
            doorState = true;
            System.out.println("我把门打开了,大象赶紧进来,我等着关门.");
        }
    }

    public void close() {
        if (doorState) {
            // 把门打开
            doorState = false;
            System.out.println("门关上了,完事了.");
        }
    }
}
